package com.xinz.protocal;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

import com.xinz.protocal.server.NativeMethod;


/**
 * 远程调用本地接口实现的过滤器
 * @author xingyun
 *
 */
public interface NativeInvokeFilter {

	/**
	 * 在准备调用本地接口之前调用，可以在过滤时候修改method的某项参数达到过滤的效果
	 * @param methodIndex
	 * @param method
	 */
	void readyInvoke(NativeMethod method);
	
	/**
	 * 在调用本地方法成功的时候调用，也可以抛出异常给客户端
	 * @param methodIndex
	 * @param method
	 */
	void invokeSuccess(NativeMethod method);
	
	/**
	 * 在调用本地方法出现异常的时候调用，用于转换实现成抛出的异常
	 * @param methodIndex
	 * @param method 
	 * @param e 有本地方法返回的异常
	 * @return 返回到客户端的异常
	 */
	InvocationTargetException invokeException(NativeMethod method, InvocationTargetException e);
	
	public static class Abstract implements NativeInvokeFilter {

		@Override
		public void readyInvoke(NativeMethod method) {
			
		}

		@Override
		public void invokeSuccess(NativeMethod method) {
			
		}

		@Override
		public InvocationTargetException invokeException(NativeMethod method,
				InvocationTargetException e) {
			
			return e;
		}
		
	}
	
	public static class ListFilter implements NativeInvokeFilter {

		List<NativeInvokeFilter> filters = new ArrayList<NativeInvokeFilter>();
		
		@Override
		public void readyInvoke(NativeMethod method) {
			for(int i = 0; i < filters.size(); ++i) {
				filters.get(i).readyInvoke(method);
			}
		}

		@Override
		public void invokeSuccess(NativeMethod method) {
			for(int i = 0; i < filters.size(); ++i) {
				filters.get(i).invokeSuccess(method);
			}
		}

		@Override
		public InvocationTargetException invokeException(NativeMethod method,
				InvocationTargetException e) {
			for(int i = 0; i < filters.size(); ++i) {
				filters.get(i).invokeException(method, e);
			}
			return e;
		}
		
		public void add(NativeInvokeFilter filter) {
			filters.add(filter);
		}
		
	}
}
